﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиСсылка
{
	///<summary>
	///(Общ)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class СотрудникиОрганизаций:СправочникСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("d8e39b2c-77c1-4485-aa1b-81256eb94277");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928011959.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public bool Предопределенный {get;set;}
		public V82.СправочникиСсылка.СотрудникиОрганизаций Родитель {get;set;}
		public bool ЭтоГруппа {get;set;}
		public string/*10*/ Код {get;set;}
		[DataMember(Name = "Представление")]//Проверить основное представление.
		[ProtoMember(3)]
		public string/*100*/ Наименование {get;set;}
		public V82.СправочникиСсылка.ФизическиеЛица Физлицо {get;set;}
		public bool Актуальность {get;set;}//Не находится в архиве
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		public V82.СправочникиСсылка.Организации ОбособленноеПодразделение {get;set;}//Трудовой договор: Обособленное подразделение
		public V82.Перечисления/*Ссылка*/.ВидыДоговоровСФизЛицами ВидДоговора {get;set;}//Вид договора
		public V82.Перечисления/*Ссылка*/.ВидыЗанятостиВОрганизации ВидЗанятости {get;set;}//Вид занятости
		public string/*(11)*/ НомерДоговора {get;set;}//Трудовой договор: Номер договора
		public DateTime ДатаДоговора {get;set;}//Трудовой договор: Дата договора
		public V82.СправочникиСсылка.ГрафикиРаботы ГрафикРаботы {get;set;}//Трудовой договор: График работы
		public V82.СправочникиСсылка.ПодразделенияОрганизаций ПодразделениеОрганизации {get;set;}//Трудовой договор: Подразделение организации
		public V82.СправочникиСсылка.ДолжностиОрганизаций Должность {get;set;}//Трудовой договор: Должность
		public decimal/*(4.2)*/ ЗанимаемыхСтавок {get;set;}//Трудовой договор: Занимаемых ставок
		public DateTime ДатаНачала {get;set;}//Трудовой договор: Дата начала
		public DateTime ДатаОкончания {get;set;}//Трудовой договор: Дата окончания
		public decimal/*(4.1)*/ ИспытательныйСрок {get;set;}//Трудовой договор: Испытательный срок
		public object ВидРасчета {get;set;}//Трудовой договор: Вид расчета
		public decimal/*(15.3)*/ ТарифнаяСтавка {get;set;}//Трудовой договор: Тарифная ставка
		public V82.СправочникиСсылка.Валюты ВалютаТарифнойСтавки {get;set;}//Трудовой договор: Валюта тарифной ставки
		public string/*(15)*/ ПостфиксНаименования {get;set;}//Постфикс наименования
		public V82.СправочникиСсылка.ТарифныеРазряды ТарифныйРазряд {get;set;}//Трудовой договор: Тарифный разряд
		public V82.СправочникиСсылка.Организации ТекущееОбособленноеПодразделение {get;set;}//Текущее обособленное подразделение
		public V82.СправочникиСсылка.ПодразделенияОрганизаций ТекущееПодразделениеОрганизации {get;set;}//Текущее подразделение организации
		public V82.СправочникиСсылка.ДолжностиОрганизаций ТекущаяДолжностьОрганизации {get;set;}//Текущая должность организации
		public DateTime ДатаПриемаНаРаботу {get;set;}//Дата приема на работу
		public DateTime ДатаУвольнения {get;set;}//Дата увольнения
		public V82.СправочникиСсылка.Подразделения ТекущееПодразделениеКомпании {get;set;}//Подразделение компании
		public V82.СправочникиСсылка.ДолжностиОрганизаций ТекущаяДолжностьКомпании {get;set;}//Должность компании
		public DateTime ДатаПриемаНаРаботуВКомпанию {get;set;}//Принят в компанию
		public DateTime ДатаУвольненияИзКомпании {get;set;}//Уволен из компании
		public bool ЯвляетсяСтудентомРаботающимВСтудотряде {get;set;}//Является студентом работающим в студотряде
		
		public СотрудникиОрганизаций()
		{
		}
		
		public СотрудникиОрганизаций(byte[] УникальныйИдентификатор)
			: this(УникальныйИдентификатор,0)
		{
		}
		
		public СотрудникиОрганизаций(byte[] УникальныйИдентификатор,int Глубина)
		{
			if (Глубина>3)
			{
				return;
			}
			if (new Guid(УникальныйИдентификатор) == Guid.Empty)
			{
				return;
			}
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_IsMetadata [Предопределенный]
					,_ParentIDRRef [Родитель]
					,_Folder [ЭтоГруппа]
					,_Code [Код]
					,_Description [Наименование]
					,_Fld19823RRef [Физлицо]
					,_Fld19824 [Актуальность]
					,_Fld19825RRef [Организация]
					,_Fld19826RRef [ОбособленноеПодразделение]
					,_Fld19827RRef [ВидДоговора]
					,_Fld19828RRef [ВидЗанятости]
					,_Fld19829 [НомерДоговора]
					,_Fld19830 [ДатаДоговора]
					,_Fld19831RRef [ГрафикРаботы]
					,_Fld19832RRef [ПодразделениеОрганизации]
					,_Fld19833RRef [Должность]
					,_Fld19834 [ЗанимаемыхСтавок]
					,_Fld19835 [ДатаНачала]
					,_Fld19836 [ДатаОкончания]
					,_Fld19837 [ИспытательныйСрок]
					,_Fld19838RRef [ВидРасчета]
					,_Fld19839 [ТарифнаяСтавка]
					,_Fld19840RRef [ВалютаТарифнойСтавки]
					,_Fld19841 [ПостфиксНаименования]
					,_Fld19842RRef [ТарифныйРазряд]
					,_Fld26595RRef [ТекущееОбособленноеПодразделение]
					,_Fld26596RRef [ТекущееПодразделениеОрганизации]
					,_Fld26597RRef [ТекущаяДолжностьОрганизации]
					,_Fld26598 [ДатаПриемаНаРаботу]
					,_Fld26599 [ДатаУвольнения]
					,_Fld26600RRef [ТекущееПодразделениеКомпании]
					,_Fld26601RRef [ТекущаяДолжностьКомпании]
					,_Fld26602 [ДатаПриемаНаРаботуВКомпанию]
					,_Fld26603 [ДатаУвольненияИзКомпании]
					,_Fld26604 [ЯвляетсяСтудентомРаботающимВСтудотряде]
					From _Reference19650(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор  -- and _Folder = 0x01  ";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Предопределенный = ((byte[])Читалка.GetValue(3))[0]==1;
							Родитель = new V82.СправочникиСсылка.СотрудникиОрганизаций((byte[])Читалка.GetValue(4),Глубина+1);
							ЭтоГруппа = ((byte[])Читалка.GetValue(5))[0]==0;
							Код = Читалка.GetString(6);
							Наименование = Читалка.GetString(7);
							if(!ЭтоГруппа)
							{
								Физлицо = new V82.СправочникиСсылка.ФизическиеЛица((byte[])Читалка.GetValue(8),Глубина+1);
								Актуальность = ((byte[])Читалка.GetValue(9))[0]==1;
								Организация = new V82.СправочникиСсылка.Организации((byte[])Читалка.GetValue(10),Глубина+1);
								ОбособленноеПодразделение = new V82.СправочникиСсылка.Организации((byte[])Читалка.GetValue(11),Глубина+1);
								ВидДоговора = V82.Перечисления/*Ссылка*/.ВидыДоговоровСФизЛицами.ПустаяСсылка.Получить((byte[])Читалка.GetValue(12));
								ВидЗанятости = V82.Перечисления/*Ссылка*/.ВидыЗанятостиВОрганизации.ПустаяСсылка.Получить((byte[])Читалка.GetValue(13));
								НомерДоговора = Читалка.GetString(14);
								ДатаДоговора = Читалка.GetDateTime(15);
								ГрафикРаботы = new V82.СправочникиСсылка.ГрафикиРаботы((byte[])Читалка.GetValue(16),Глубина+1);
								ПодразделениеОрганизации = new V82.СправочникиСсылка.ПодразделенияОрганизаций((byte[])Читалка.GetValue(17),Глубина+1);
								Должность = new V82.СправочникиСсылка.ДолжностиОрганизаций((byte[])Читалка.GetValue(18),Глубина+1);
								ЗанимаемыхСтавок = Читалка.GetDecimal(19);
								ДатаНачала = Читалка.GetDateTime(20);
								ДатаОкончания = Читалка.GetDateTime(21);
								ИспытательныйСрок = Читалка.GetDecimal(22);
								ТарифнаяСтавка = Читалка.GetDecimal(24);
								ВалютаТарифнойСтавки = new V82.СправочникиСсылка.Валюты((byte[])Читалка.GetValue(25),Глубина+1);
								ПостфиксНаименования = Читалка.GetString(26);
								ТарифныйРазряд = new V82.СправочникиСсылка.ТарифныеРазряды((byte[])Читалка.GetValue(27),Глубина+1);
								ТекущееОбособленноеПодразделение = new V82.СправочникиСсылка.Организации((byte[])Читалка.GetValue(28),Глубина+1);
								ТекущееПодразделениеОрганизации = new V82.СправочникиСсылка.ПодразделенияОрганизаций((byte[])Читалка.GetValue(29),Глубина+1);
								ТекущаяДолжностьОрганизации = new V82.СправочникиСсылка.ДолжностиОрганизаций((byte[])Читалка.GetValue(30),Глубина+1);
								ДатаПриемаНаРаботу = Читалка.GetDateTime(31);
								ДатаУвольнения = Читалка.GetDateTime(32);
								ТекущееПодразделениеКомпании = new V82.СправочникиСсылка.Подразделения((byte[])Читалка.GetValue(33),Глубина+1);
								ТекущаяДолжностьКомпании = new V82.СправочникиСсылка.ДолжностиОрганизаций((byte[])Читалка.GetValue(34),Глубина+1);
								ДатаПриемаНаРаботуВКомпанию = Читалка.GetDateTime(35);
								ДатаУвольненияИзКомпании = Читалка.GetDateTime(36);
								ЯвляетсяСтудентомРаботающимВСтудотряде = ((byte[])Читалка.GetValue(37))[0]==1;
							}
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.СправочникиОбъект.СотрудникиОрганизаций  ПолучитьОбъект()
		{
			var Объект = new V82.СправочникиОбъект.СотрудникиОрганизаций();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Предопределенный = Предопределенный;
			Объект.Родитель = Родитель;
			Объект.ЭтоГруппа = ЭтоГруппа;
			Объект.Код = Код;
			Объект.Наименование = Наименование;
			Объект.Физлицо = Физлицо;
			Объект.Актуальность = Актуальность;
			Объект.Организация = Организация;
			Объект.ОбособленноеПодразделение = ОбособленноеПодразделение;
			Объект.ВидДоговора = ВидДоговора;
			Объект.ВидЗанятости = ВидЗанятости;
			Объект.НомерДоговора = НомерДоговора;
			Объект.ДатаДоговора = ДатаДоговора;
			Объект.ГрафикРаботы = ГрафикРаботы;
			Объект.ПодразделениеОрганизации = ПодразделениеОрганизации;
			Объект.Должность = Должность;
			Объект.ЗанимаемыхСтавок = ЗанимаемыхСтавок;
			Объект.ДатаНачала = ДатаНачала;
			Объект.ДатаОкончания = ДатаОкончания;
			Объект.ИспытательныйСрок = ИспытательныйСрок;
			Объект.ВидРасчета = ВидРасчета;
			Объект.ТарифнаяСтавка = ТарифнаяСтавка;
			Объект.ВалютаТарифнойСтавки = ВалютаТарифнойСтавки;
			Объект.ПостфиксНаименования = ПостфиксНаименования;
			Объект.ТарифныйРазряд = ТарифныйРазряд;
			Объект.ТекущееОбособленноеПодразделение = ТекущееОбособленноеПодразделение;
			Объект.ТекущееПодразделениеОрганизации = ТекущееПодразделениеОрганизации;
			Объект.ТекущаяДолжностьОрганизации = ТекущаяДолжностьОрганизации;
			Объект.ДатаПриемаНаРаботу = ДатаПриемаНаРаботу;
			Объект.ДатаУвольнения = ДатаУвольнения;
			Объект.ТекущееПодразделениеКомпании = ТекущееПодразделениеКомпании;
			Объект.ТекущаяДолжностьКомпании = ТекущаяДолжностьКомпании;
			Объект.ДатаПриемаНаРаботуВКомпанию = ДатаПриемаНаРаботуВКомпанию;
			Объект.ДатаУвольненияИзКомпании = ДатаУвольненияИзКомпании;
			Объект.ЯвляетсяСтудентомРаботающимВСтудотряде = ЯвляетсяСтудентомРаботающимВСтудотряде;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.СправочникиСсылка.СотрудникиОрганизаций ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.СправочникиСсылка.СотрудникиОрганизаций)Кэш[УИ];
			}
			var Ссылка = new V82.СправочникиСсылка.СотрудникиОрганизаций(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}